package bud.web.controller;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.support.RequestContextUtils;

import bud.vo.BoardBudDTO;
import bud.vo.BoardFormDTO;
import bud.web.boardbud.service.IBoardbudService;
import bud.web.boardbud.service.IBoardbudService.BoardbudResult;


@Controller
public class BoardbudController {
	@Inject
	IBoardbudService service;
	
	@RequestMapping("boardbudList")
	public String boardbudList(@ModelAttribute("formDTO") BoardFormDTO<BoardBudDTO> formDTO,
			Model model, String msg) {
		if(formDTO.getCurrentPage()==null) {
			formDTO.setCurrentPage(1);
		}
		formDTO.setScreen_size(15);
		formDTO.setBlock_size(7);
		formDTO.setTotalRecords(service.getBoardbudCount(formDTO));

		model.addAttribute("msg", msg);
		
		//페이징 처리를 위한 어트리뷰트를 스코프에 추가
		List<BoardBudDTO> boardList = service.getBoardbudList(formDTO);
		formDTO.setDataList(boardList);
		return "boardbud/boardbudList";
	}
	
	@RequestMapping("boardbudForm")
	public String boardbudForm() {
		return "boardbud/boardbudForm";
	}
	
	@RequestMapping("boardbudInsert")
	public String boardbudInsert(@ModelAttribute("boardbud")BoardBudDTO boardbud, 
			Errors error, Model model) throws UnsupportedEncodingException {
		String goPage=null;
		if(error.hasErrors()) {
			model.addAttribute("msg", "알 수 없는 오류가 발생, 잠시 후 다시 시도해주세요.");
			goPage = "boardbud/boardbudForm";
		} 
			BoardbudResult result = service.createBoardbud(boardbud);
			if(result == BoardbudResult.OK) {
				model.addAttribute("msg", "정상 등록 완료");
				goPage = "redirect:/boardbudList.do";
			} else {
				model.addAttribute("msg", "알 수 없는 오류가 발생, 잠시 후 다시 시도해주세요.");
				goPage = "boardbud/boardbudForm";
			}
		return goPage;
	}
	
	@RequestMapping("boardbudView")
	public String boardbudView(String msg, int bo_no,HttpServletRequest request,
			Model model) {
		BoardBudDTO boardbud = service.getBoardbud(bo_no);
		if(boardbud == null) {
			msg="글번호에 해당하는 게시글이 없습니다.";
			return "boardbud/boardbudList";
		}
		
		
		//댓글 페이징을 위한 어트리뷰트 추가
		BoardFormDTO<BoardBudDTO> form = new BoardFormDTO<BoardBudDTO>();
		form.setCurrentPage(1);
		form.setScreen_size(10);
		form.setBlock_size(5);
		form.setTotalRecords(service.getRepCount(boardbud.getBo_no()));
		form.setData(boardbud);
		model.addAttribute("formDTO", form);
		model.addAttribute("boardbud", boardbud);
		model.addAttribute("msg", msg);
		return  "boardbud/boardbudView";
	}
	
	@RequestMapping("boardbudEdit")
	public String boardbudEdit(String msg, @RequestParam("bo_no") int bo_no,
			Model model) {
		BoardBudDTO boardbud = service.getBoardbud(bo_no);
		if(boardbud == null) {
			msg="글번호에 해당하는 게시글이 없습니다.";
			return "boardbud/boardbudList";
		}
		model.addAttribute("boardbud", boardbud);
		model.addAttribute("msg", msg);
		return "boardbud/boardbudEdit";
	}
	
	@RequestMapping("boardbudUpdate")
	public String boardbudUpdate(@ModelAttribute("boardbud") BoardBudDTO boardbud, 
			Model model) throws IOException{
		BoardbudResult result = service.modifyBoardbud(boardbud);
		String goPage=null;
		String msg=null;
		if(result==BoardbudResult.OK) {
			msg="수정 완료";
			model.addAttribute("msg", msg);
			goPage="redirect:/boardbudView.do?bo_no="+boardbud.getBo_no();
		} else if(result==BoardbudResult.INVALIDPASSWORD) {
			msg="비밀번호 오류, 확인 후 다시 시도해주세요.";
			model.addAttribute("msg", msg);
			goPage ="redirect:/boardbudEdit.do?bo_no="+boardbud.getBo_no();
		} else {
			msg="알 수 없는 오류, 잠시 후 다시 시도해주세요.";
			model.addAttribute("msg", msg);
			goPage = "redirect:/boardbudEdit.do?bo_no="+boardbud.getBo_no();
		}
		return goPage;
	}
	
	@RequestMapping("boardbudDelete") 
	public String boardbudDelete(@ModelAttribute("boardbud") BoardBudDTO boardbud, Model model,
			HttpServletResponse response, HttpServletRequest request) throws IOException {
		if(boardbud.getBo_no()==null) {
			response.sendError(HttpServletResponse.SC_BAD_REQUEST, "삭제글 번호가 없습니다");
			return null;
		}
		BoardbudResult result = service.removeBoardbud(boardbud);
		String goPage = null;
		String msg = null;
		if(result == BoardbudResult.OK) {
			msg="삭제 완료";
			model.addAttribute("msg", msg);
			goPage = "redirect:/boardbudList.do";
		} else if(result==BoardbudResult.INVALIDPASSWORD) {
			msg="비밀번호 오류, 확인 후 다시 시도해주세요";
			model.addAttribute("msg", msg);
			goPage = "redirect:/boardbudEdit.do?bo_no="+boardbud.getBo_no();
		} else {
			msg="알수없는 오류로 정상처리 불가능, 잠시 후 다시 시도해주세요";
			model.addAttribute("msg", msg);
			goPage = "redirect:/boardbudEdit.do?bo_no="+boardbud.getBo_no();
		}
		return goPage;
	}
}


